<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        /* 
            let和var的区别：
                1、let不能重复声明。
                2、let有块级作用域，相当于java中的成员变量和局部变量。
                3、let不会预解析进行变量提升。
                4、let定义的变量不会作为window的属性。
                5、let在es6中推荐使用
        */

        // let不能重复声明
        var a = 4
        var a = 5
        let b = 4
        // let b = 5 // 不可重复声明
        console.log(a,b)


        // let有块级作用域
        {
            var c = 3
            let d = 4
        }
        // console.log(c, d)// 打印d报错，d is not defined。c可以正常打印


        // let不会预解析进行变量提升
        console.log(e)
        var e = 3
        // console.log(f) // 打印f报错，Cannot access 'f' before initialization
        let f = 3


        // let定义的变量不会作为window的属性
        var g = 4
        console.log(window.g)
        let h = 3
        console.log(window.h) // 打印的是undefined

        /* 
            const与var的差别：
                1、const和let类似，只是const定义的变量不能修改，相当于java中使用final修饰的变量
                2、并不是变量的值不能改变，而是变量指向的那个内存地址的地址值不能变。
        */
       const PI = 3.1415
       // PI = 3.14 // 这里虽然在代码里面没有报错，但是在浏览器解析的时候会报错

       const arr = ["1", "2", "3"]
       arr.push("4") // 这里不报错，因为arr指向的内存地址没变，还是原来的数组
       // arr = [] // 这里浏览器解析时报错，因为不是原来的数组了，地址变了
    </script>
</head>
<body>
    
</body>
</html>